package cz.zcu.sefler.mois.presentation;

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import cz.zcu.sefler.mois.business.MonitorManager;
import cz.zcu.sefler.mois.data.ZipOutputer;
import cz.zcu.sefler.mois.data.model.Monitor;

/**
 * Tento servlet zajisti zpracovani zadane adresy rozhovoru. Dale umoznuje
 * projit cely server super.cz a vysledky vratit uzivateli v podobe zip souboru.
 * 
 * @author Vojtech Sefler
 * 
 */
public class NewMonitor extends HttpServlet {
  private static final long serialVersionUID = 1L;

  ServletContext            sc;
  ZipOutputer               zipper;

  public NewMonitor() {
    super();
  }

  protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    doPost(request, response);

  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    sc = this.getServletContext();

    /*
     * Vytvorime pristup do DB a instanci pro vytvareni zip souboru, pokud tyto
     * zdroje jeste nebyly vytvoreny.
     */

    if (zipper == null) {
      zipper = new ZipOutputer(sc.getInitParameter("db-machine"), sc.getInitParameter("db-db"), sc.getInitParameter("db-user"), sc
          .getInitParameter("db-pass"));
    }

    if (sc.getAttribute("monitorManager") == null) {
      sc.setAttribute("monitorManager", new MonitorManager(sc.getInitParameter("db-machine"), sc.getInitParameter("db-db"), sc
          .getInitParameter("db-user"), sc.getInitParameter("db-pass")));
    }

    /* Akce identifikuje volbu uzivatele. */
    int akce = 0;
    if (request.getParameter("akce") != null) {
      akce = Integer.valueOf(request.getParameter("akce"));
    }

    switch (akce) {
      case 1:
        /* Zpracovani rozhovoru zadaneho adresou. */
        Monitor newMonitor = new Monitor(request.getParameter("nm_url"));
        ((MonitorManager) sc.getAttribute("monitorManager")).createMonitor(newMonitor);
        /*
         * Vypise se zprava o uspesnem ulozeni. Zpracovani stale jeste muze
         * probihat nejaky cas.
         */
        request.setAttribute("outcome_msg_nm", "Uložení proběhlo v pořádku.");
        sc.getRequestDispatcher("/jsp/newmonitor.jsp").forward(request, response);
        break;

      case 2:
        /* Pozadavek na zpracovani vsech rozhovoru na serveru super.cz */
        ((MonitorManager) sc.getAttribute("monitorManager")).getWholeSuperCz();
        request.setAttribute("outcome_msg_nm", "Super.cz zpracován.");
        sc.getRequestDispatcher("/jsp/newmonitor.jsp").forward(request, response);
        break;

      /*
       * Nasleduje zpracovani pozadavku na .zip soubory. Po techto pozadavcich
       * neprovadime forward na puvodni jsp stranku, nebot vystupni proud byl
       * jiz naplnen .zip souborem.
       */

      case 3:
        response.reset();
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "inline; filename=interviews.zip;");

        /*
         * Zpracovani pozadavku na .zip soubor, ktery obsahuje vsechny rozhovory
         * vcetne jejich vet v podobe XML souboru.
         */
        try {
          zipper.getAllMonitorsZip(response.getOutputStream());
        } catch (Exception e) {
          request.setAttribute("outcome_msg_nm", "Nastala chyba: " + e.getMessage());
        }

        response.flushBuffer();
        break;

      case 4:
        response.reset();
        response.setContentType("application/zip");
        response.setHeader("Content-Disposition", "inline; filename=sentences.zip;");

        /*
         * Zpracovani pozadavku na .zip soubor, ktery obsahuje vsechny vety v
         * podobe XML souboru.
         */
        try {
          zipper.getAllSentencesZip(response.getOutputStream());
        } catch (Exception e) {
          request.setAttribute("outcome_msg_nm", "Nastala chyba: " + e.getMessage());
        }

        response.flushBuffer();
        break;

      default:
        sc.getRequestDispatcher("/jsp/newmonitor.jsp").forward(request, response);
        break;
    }

  }

}
